package com.rubiksillusions;

public class PositionOfLastLayerCornersAlgorithm extends Algorithm {
	public String execute(RubiksCube rubiksCube) {
		for (int i = 0; i < 5; i++) {
			if (!(isWellPositioned(0, rubiksCube) && isWellPositioned(2, rubiksCube) && isWellPositioned(6, rubiksCube) && isWellPositioned(8, rubiksCube))) {
				if (isWellPositioned(2, rubiksCube)) {
					rubiksCube.executeMovesList("Z' ", true);
				} else if (isWellPositioned(6, rubiksCube)) {
					rubiksCube.executeMovesList("Z ", true);
				} else if (isWellPositioned(8, rubiksCube)) {
					rubiksCube.executeMovesList("Z2 ", true);
				}
				rubiksCube.executeMovesList("U L U' R' U L' U' R ", true);
			}
		}
		return rubiksCube.getExecutedMovesList(true);
	}
	
	private boolean isWellPositioned(int cubelet, RubiksCube rubiksCube) {
		if (cubelet == 0) {
			if (rubiksCube.testStatus("....y.y........................b.b....o.o.............")) return true;
			if (rubiksCube.testStatus("....y.y........................b.o....b.o.............")) return true;
			if (rubiksCube.testStatus("....y.b........................b.y....o.o.............")) return true;
			if (rubiksCube.testStatus("....y.b........................b.o....y.o.............")) return true;
			if (rubiksCube.testStatus("....y.o........................b.b....y.o.............")) return true;
			if (rubiksCube.testStatus("....y.o........................b.y....b.o.............")) return true;
		} else if (cubelet == 2) {
			if (rubiksCube.testStatus("....y...y..................b...b.................o.o..")) return true;
			if (rubiksCube.testStatus("....y...y..................o...b.................o.b..")) return true;
			if (rubiksCube.testStatus("....y...b..................y...b.................o.o..")) return true;
			if (rubiksCube.testStatus("....y...b..................o...b.................o.y..")) return true;
			if (rubiksCube.testStatus("....y...o..................b...b.................o.y..")) return true;
			if (rubiksCube.testStatus("....y...o..................y...b.................o.b..")) return true;
		} else if (cubelet == 6) {
			if (rubiksCube.testStatus("y...y.............b...b.............o...o.............")) return true;
			if (rubiksCube.testStatus("y...y.............o...b.............b...o.............")) return true;
			if (rubiksCube.testStatus("b...y.............y...b.............o...o.............")) return true;
			if (rubiksCube.testStatus("b...y.............o...b.............y...o.............")) return true;
			if (rubiksCube.testStatus("o...y.............b...b.............y...o.............")) return true;
			if (rubiksCube.testStatus("o...y.............y...b.............b...o.............")) return true;
		} else if (cubelet == 8) {
			if (rubiksCube.testStatus("..y.y.................o.b....................o...b....")) return true;
			if (rubiksCube.testStatus("..y.y.................o.o....................b...b....")) return true;
			if (rubiksCube.testStatus("..b.y.................o.y....................o...b....")) return true;
			if (rubiksCube.testStatus("..b.y.................o.o....................y...b....")) return true;
			if (rubiksCube.testStatus("..o.y.................o.b....................y...b....")) return true;
			if (rubiksCube.testStatus("..o.y.................o.y....................b...b....")) return true;
		}
		
		return false;
	}
}
